package com.xjn.updatetool.service.impl;

import com.xjn.updatetool.service.AppUpdater;
import com.xjn.updatetool.util.FileNameUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.FileCopyUtils;

import java.io.File;
import java.io.FileWriter;
import java.time.LocalDateTime;
import java.util.Date;

/**
 * @author lilin
 * @create 2020-07-29 10:34
 **/
@Service
public class AppUpdaterV1Impl implements AppUpdater {
    @Value("${updatetool.dir.src}")
    private String dirSrc;
    @Value("${updatetool.dir.dst}")
    private String dirDst;
    @Value("${updatetool.dir.log}")
    private String dirLog;


    @Override
    public void startUpdate() throws Exception {
        LocalDateTime now = LocalDateTime.now();
        StringBuffer log= new StringBuffer();
        log.append("升级时间：").append(now.toString()).append("\r\n");
        System.out.println("源文件夹："+dirSrc);
        System.out.println("目标文件夹："+dirDst);
        log.append("源文件夹：").append(dirSrc).append("\r\n");
        log.append("目标文件夹：").append(dirDst).append("\r\n");
        /**
         * 遍历源文件夹，如果有文件，就更新到目标相同文件夹下
         * 目标如果已存在，改名备份后再覆盖
         */
        File file = new File(dirSrc);        //获取其file对象
        loopDir(file,log);//补充文件夹
        loopFile(file,log,now);//更新文件

        log.append("----结束-----");
        String logPath = FileNameUtil.createLogFilePath(dirLog,now,"升级");
        FileWriter fileWriter = new FileWriter(logPath, true);
        fileWriter.write(log.toString());
        fileWriter.flush();
    }

    @Override
    public void updateDir(File dir,StringBuffer log) throws Exception {
        String dstPath = FileNameUtil.changeBaseDir(dir.getPath(),dirSrc,dirDst);
        File dstDir = new File(dstPath);
        if(!dstDir.exists()){//判断文件目录是否存在
            dstDir.mkdirs();
            System.out.println("添加目录："+dstPath);
            log.append("添加目录：").append(dstPath).append("\r\n");
        }
    }

    @Override
    public void updateFile(File file,StringBuffer log,LocalDateTime now) throws Exception {
        String dstPath = FileNameUtil.changeBaseDir(file.getPath(),dirSrc,dirDst);
        File dstFile = new File(dstPath);
        if(dstFile.exists()){
            String bakFilePath = FileNameUtil.createBakFilePath(dstFile,now);
            File bakFile = new File(bakFilePath);
            FileCopyUtils.copy(dstFile,bakFile);
            System.out.println("备份文件："+dstPath);
            log.append("备份文件：").append(dstPath).append("\r\n");
            System.out.println("备份文件为："+bakFilePath);
            log.append("备份文件为：").append(bakFilePath).append("\r\n");
        }
        FileCopyUtils.copy(file,dstFile);
        System.out.println("更新文件："+dstPath);
        log.append("更新文件：").append(dstPath).append("\r\n");
    }
    private void loopDir(File file,StringBuffer log) throws Exception{
        File[] fs = file.listFiles();
        for(File f:fs){
            if(f.isDirectory()) {    //若是目录，则递归打印该目录下的文件
                updateDir(f,log);
                loopDir(f,log);
            }
        }
    }
    private void loopFile(File file,StringBuffer log,LocalDateTime now) throws Exception{
        File[] fs = file.listFiles();
        for(File f:fs){
            if(f.isDirectory()) {    //若是目录，则递归打印该目录下的文件
                loopFile(f,log,now);
            }
            if(f.isFile()) {        //若是文件，调用升级方法
                updateFile(f,log,now);
            }
        }
    }
}
